//package com.per.mybootall.service.impl;
//
//import com.per.mybootall.service.RedissonBloomFilterService;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.ExpiredObjectListener;
//import org.redisson.api.RBloomFilter;
//import org.redisson.api.RedissonClient;
//
//import javax.annotation.Resource;
//import java.nio.charset.StandardCharsets;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.TimeUnit;
//
///**
// * 布隆过滤器实现类
// * */
//@Slf4j
//public class RedissonBloomServiceImpl implements RedissonBloomFilterService {
//    public static String prefix = "redission_bf_";
//    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
//    private static final int TIME_FORMAT_LENGTH = 8;
//    @Resource
//    private RedissonClient redissonClient;
//    //new一个线程安全map
//    private Map<String, ConcurrentHashMap<String, RBloomFilter>> bloomFilterMap = new ConcurrentHashMap<>();
//    /**
//     * 初始化一个布隆过滤器
//     *
//     * @param key                key
//     * @param expireDate         过期时间长度
//     * @param timeUnit           过期时间单位
//     * @param expectedInsertions 预期插入量
//     * @param falseProbability   失效概率（概率越小则占用内存越大，一般0.3就可以了）
//     * @return 是否创建成功
//     */
//    @Override
//    public boolean initNewFilter(String key, Long expireDate, TimeUnit timeUnit, long expectedInsertions, double falseProbability) {
//        RBloomFilter rBloomFilter= redissonClient.getBloomFilter(prefix+formatter+key);
//        //预期插入数据，失效概率
//        boolean isSuccess= rBloomFilter.tryInit(expectedInsertions,falseProbability);
//        //创建成功
//        if(isSuccess){
//            //设置过期时间
//            rBloomFilter.expire(expireDate,timeUnit);
//
//            //设置过期监听器
//            rBloomFilter.addListener(new ExpiredObjectListener() {
//                //该过滤器过期的话就删除所有数据
//                @Override
//                public void onExpired(String s) {
//                    //判断是否以该前缀开始
//                    if (key.startsWith(prefix)) {
//                        String firstKey = key.substring(prefix.length() + TIME_FORMAT_LENGTH);
//                        ConcurrentHashMap<String, RBloomFilter> map = bloomFilterMap.get(firstKey);
//                        if (Objects.isNull(map)) {
//                            return;
//                       }
//                        map.remove(key);
//                    }
//                }
//            });
//        }else{
//            log.error("布隆过滤器初始化失败");
//        }
//        return false;
//    }
//
//    /**
//     * add到过滤器
//     * */
//    @Override
//    public boolean add(String key, String value) {
//        //线程安全的日期相关操作
//        String timeFormatter = formatter.format(LocalDateTime.now());
//        ConcurrentHashMap<String, RBloomFilter> map=bloomFilterMap.get(key);
//        if (Objects.isNull(map)) {
//            log.error("添加时键值为空", key, value);
//            return false;
//        }
//        RBloomFilter rBloomFilter = map.get(prefix + timeFormatter + key);
//        if (Objects.isNull(rBloomFilter)) {
//            log.error("添加时键值为空", key, prefix + timeFormatter + key, value);
//            return false;
//        }
//        return rBloomFilter.add(value);
//
//    }
//
//    /**
//     * add到过滤器
//     * */
//    @Override
//    public boolean add(String key, List<String> list) {
//        String timeFormatter = formatter.format(LocalDateTime.now());
//        ConcurrentHashMap<String, RBloomFilter> map = bloomFilterMap.get(key);
//        if (Objects.isNull(map)) {
//            log.error("添加名称键列表值为空", key);
//            return false;
//        }
//        RBloomFilter rBloomFilter = map.get(prefix + timeFormatter + key);
//        if (Objects.isNull(rBloomFilter)) {
//            log.error("添加名称键列表值为空", key,prefix + timeFormatter + key);
//            return false;
//        }
//        list.forEach(value -> rBloomFilter.add(value));
//        return true;
//    }
//
//    /**
//     * 判断是否存在值
//     * */
//    @Override
//    public boolean containsValue(String key, String value) {
//        ConcurrentHashMap<String, RBloomFilter> map = bloomFilterMap.get(key);
//        if (Objects.isNull(map)) {
//            log.error("包含值已经存在", key);
//            return false;
//        }
//        for (Map.Entry<String, RBloomFilter> entry : map.entrySet()) {
//            if (entry.getValue().contains(value)) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 判断是否存在值
//     * */
//    @Override
//    public boolean containKey(String key) {
//        return bloomFilterMap.containsKey(key);
//    }
//
//
//
//}
